import { defineStore } from 'pinia'
import { login, logout, getPermissionMenu } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/cookie'
import { reactive, ref } from 'vue'
// import { dynamicRouter } from '@/utils/router.js'
// import router from '@/router'

const getItem = (title) => {
	return JSON.parse(localStorage.getItem(title))
}
const setItem = (title,value) => {
	return localStorage.setItem(title,JSON.stringify(value))
}

const removeItem = (title) => {
	return localStorage.removeItem(title)
}

export const useUserStore = defineStore('user', () => {
	const token = ref(getToken() || "")

	let userInfo = reactive(getItem("userInfo") || {})		// 用户信息（userInfo、token 其他api请求依赖这两项，所以需要持久化存本地，防止用户刷新浏览器导致数据丢失）
	const permissionMenu = ref(getItem("permissionMenu") || []) // 当前用户权限菜单
	//  登录
	const Login = async (data) => {
		return new Promise((reslove, reject) => {
			login(data).then((res) => {
				if (res.error == 0) {
					token.value = res.token
					setToken(token.value)
					 setUserInfo(res.data)
					GetPermissionMenu(data)
				}
				reslove(res)
			}).catch(err => {
				reject(err)
			})
		})
	}

	// 退出
	const Logout = () => {
		return new Promise((reslove, reject) => {
			// 返回部分用户信息
			logout().then(res => {
				token.value = ""
				permissionMenu.value = []
				userInfo = {}
				removeToken()
				removeItem("permissionMenu")
				removeItem("userInfo")
				reslove(res)
			}).catch(err => {
				reject(err)
			})
		})
	}


	//设置用户信息
	const setUserInfo = (data) => {
		setItem('userInfo', data)
	}

	//修改用户信息
	const updateUserInfo = (data) => {
		Object.assign(userInfo, data)
		setUserInfo(userInfo)
		// 调用修改用户信息接口
	}

	// 获取用户权限菜单
	const GetPermissionMenu = (data) => {
		getPermissionMenu(data).then(res => {
			permissionMenu.value = res.data
			setItem('permissionMenu',res.data)
		})
	}


	// 修改密码
	const updatePassword = (data) => {
		// 调用后端修改密码接口 
		const { oldPass, newPass } = data
		// 这里后端的逻辑是，先判断旧密码是否正确，正确后再进行修改
		// 根据情况来决定要不要自动退出重新登录
		console.log(oldPass, newPass);
	}

	return {
		token,
		userInfo,
		permissionMenu,
		Login,
		Logout,
		setUserInfo,
		GetPermissionMenu,
		updateUserInfo,
		updatePassword
	}
})